В первую очередь статические методы и классы это не комильфо не потому, что не ООП, а потому, что во первых, дают жесткую привязку к коду, код становится негибким, а во вторых, тестировать код, наполненный статикой - проблемно, дают много зависимостей от которых не абстрагироваться. Плюс глобальная видимость.
Статические методы удобно, когда их используешь просто как глобальную функцию, которая нужна во многих местах, например, преобразовать строку или дату к какому-то виду. Только такая функция не должна содержать бизнес логику. В многопоточном режиме может возникнуть проблема в тех же случаях, что и во всех остальных - когда внутри метода изменяются данные с общшим доступом.
Если возникает необходимость сделать статические методы с логикой посерьезней фильтра списка, например, доступ к БД, то есть пара вариантов в этом случае. Первый, сделать синглтон, если хотите, чтобы была одна точка входа для доступа к БД и Вы хотите эту точку и попытки получения данных из БД контролировать.
Второй, это иньекция зависимостей и контейнеры для них, всевозможные IoC. В настройках IoC указываете, что выдавать единственный экземпляр и он по сути сам станет singlton, фабрика контейнера не будет на каждое обращение создавать новый экземпляр.
Лично я статическими методами и даже полями пользуюсь. Иметь хелперы, это удобно, но, конечно, без фанатизма.