Статические классы и методы используются в редких случаях, для выполнения несложных действий, например, для транслитерации строк - т.к. постоянное создание объектов для классов этих функций может усложнить код.
Во всех остальных случаях лучше не использовать статические классы и методы, т.к. их тяжело тестировать и расширять. По сути, статический метод является глобальной функцей, а это возвращение к процедурному программированию.
Синглтон тоже лучше не использовать в своих проектах, т.к. это антипаттерн. Для создания объектов лучше использовать DI-контейнер или Service Locator.