Синглтоны считаются злом, потому что неправильное их использование может затруднить тестирование. Если тестируемый код выходит из игры и захватывает статический синглтон, то этот синглтон становится трудным для проверки.
Чтобы смягчить проблему тестирования, ваш код никогда не должен получать синглтона. Всегда принимайте его как параметр конструктора или вставляйте его в структуру DI. Конечно, DI просто перемещает проблему, потому что тогда компонент DI становится единственным, к которому твой код обращается и получает. Но тогда вам нужно только выяснить, как издеваться над компонентом DI, а не кучей других вещей.
В Android Application
фактически является одиночным, поскольку для каждой виртуальной машины создается только один экземпляр. Так что это хорошее место для размещения других синглетонов, таких как DI-компонент.