I'm afraid it will fail in some scenrios. It is often needed that a singleton instance does not exist in the scene before we enter play mode, and is created only if (and when) it is called. It's lazy instanciation. It is also often needed for a game object to use a singleton during its destruction, for example to unregister itself from it (listener pattern), or write a destruction log. In these conditions, on application quit, such a game object may cause the re-instanciation of the singleton after its OnDestroy, depending on the order of destruction (which must remain unpredictable). I've ended up using the RuntimeInitializeOnLoadMethod attribute in all the concrete implementations that may suffer from this issue, but I feel like it's not ideal. Anyway, thank you @alexeyzakharov for your time and efforts.