In our code base, I have instrumented properly singletons so that they can be used in unit tests without any problem. I don't really understand why apparently I am the only one who have done such an implementation, as to me the needs seems rather fundamental.
We have a BaseSingleton<T> template class. Among other things, the getter function will create atomically the underlying object if not already created and register the pointer to the newly created object inside an array of pointers. Each object has a reference counter. At the end of each unit test (we are using CATCH framework), registered singletons are released in reverse order of creation. It is possible that during singleton destruction phase, some other singletons are created again. In case of resurrection, those resurrected singletons are released again until none remain.
By the way, I implemented a similar feature for threads. In our framework, spawn threads are
automatically stopped at the end of each unit test. In this case also, resurrected thread can happen, and we try again stopping those.
Given the instrumentation of BaseSingleton<T>, we are using it a lot in our code base, even when only second point yields true (Single instance needed), without the need of global access. It happened that because of the instrumentation, it actually makes things often more testable with a singleton than a manually created object, because the lifetime of the object is handled automatically.