This is the right spirit. Avoiding useless extra instances of objects and getting the useful objects where are needed are two interlinked rather difficult problems; rather tragically, progressing on the former makes the latter harder.
You want just one: Instanciate just one. You want global access? Make it a global.
Good solutions require good design and forethought, and often tedious code, for example lots of parameters and variables to pass objects around or checks of the presence and validity of objects that might or might not have been initialized, not to mention (in many cases) understanding and accepting the price of global variables: obviously the average mediocre programmer is attracted by singletons because
- Singletons look clever and legitimate (a tie-wearing design pattern!) without entailing actual design effort. If it shouldn't have been a singleton, you'll find out when it's too late to change your mind cheaply, because you didn't consider different options and contingencies at the proper time.
- Accessing singletons allows a strong subconscious denial (or intentional camouflage) that you are using a global variable, and a delusion that what you are doing is technically better (or at least more enterprisey).