The three problems of the title — the first two widely discussed in the literature, the third less well known but just as important for further development of object technology — are: • Eradicating the risk of void calls: x.f with, at run time, the target x not denoting any object, leading to an exception and usually a crash. • Eradicating the risk of “catcalls”: erroneous run-time situations, almost inevitably leading to crashes, resulting from the use of covariant argument typing. • Providing a simple way, in concurrent object-oriented programming, to lock an object handled by a remote processor or thread of control, or to access it without locking it, as needed by the context and in a safe way. A language mechanism provides a combined solution to all three issues. This mechanism also allows new solutions to two known problems: how to check that a certain object has a certain type, and then use it accordingly (“Run-Time Type Identification” or “downcasting”), f...