Здесь есть два отличия, которые необходимо отметить. Первый - это шаблон проектирования Singleton, а другой - экземпляр Singleton.
Шаблон проектирования Singleton проблематичен из-за того, что шаблон проектирования представляет экземпляр Singleton, реализованный с использованием статического состояния (что плохо по ряду причин - особенно при модульном тестировании). Второй - это экземпляр, для которого есть только один экземпляр, несмотря ни на что (например, синглтон JVM, реализованный в виде перечисления).
Версия enum определенно лучше, чем шаблон Singleton.
Если вы не хотите реализовывать все экземпляры как enum
экземпляры, то вам следует подумать об использовании Dependency Injection (таких фреймворков, как Google Guice ) для управления одноэлементными экземплярами приложения.