Ответ, по-моему, очевиден - в синглотне есть экземпляр класса, в стат. методах и свойствах - нет. Из этого вытекает большое количество различий при ООП кодинге. Как один из примеров - у нас есть 4 реализации хранилища (файлы, бд, мемкеш и куки, например). Все хранилища описываются 1 общим интерфейсом, всех должно быть не более, чем по 1 экземпляру. Приложение можно написать 2 способами(как минимум) :
1. передавая экземпляр класса, поддерживающего интерфейс хранилища в параметре функции
2. Как предложил выше ты - запрашивая стат методы до вызова функции
Нам потребовалось перевести хранение данных корзины из базы данных в куки (тем более, если есть необходимость выбирать хранилище в зависимости от логики) - в первом случае мы ввели в конструктор синглтона логику определения, экземпляр какого класса нужно отдавать и хранить (синглтон стал фабрикой) - на этом все изменения закончились, в случае же если мы пользовались стат методами и свойствами - нам нужно найти все места в коде с вызовами типа DbEngine::... и заменить на CookieEngine::... в лучшем случае (когда нужно просто заменить хранилище) и ломать голову, куда поместить эту логику выбора хранилища в случае, если нужно хранить и в бд и в куках.
Это один, самый очевидный пример. Когда что-то делаешь - нужно понимать, что и зачем ты делаешь, какие задачи в будущем можешь встретить.
(Добавление)
передавая экземпляры классов как параметры функций, уменьшается взаимосвязь компонент между собой. Например есть 2 библиотеки - одна отвечает за сохранение информации в файл, вторая отвечает за просмотр кук и сохранение какой-то строки в файл, если кука равна 10, например (вполне встречаемый кейс для аналитиков). Вот вторую либу можно сделать зависимой от первой (внутри библиотеки жестко вызывать методы первой либы или создавать экземпляр - не важно), а можно сделать независимой (принимать в качестве параметра экземпляр первой либы и с помощью этого экземпляра сохранять данные). Думаю, не стоит объяснять, что второй метод облегчит тебе жизнь, в случае, если меняются алгоритмы сохранения или в случае, если первая либа стала платной и заказчик удалил ее с сервера.
Есть инверсия зависимостей, dependency injection - много умных слов, касающихся зависимостей классов и методов их связывания между собой ... читай, учись и все будет понятнее и понятнее