Нет никакой разницы, не только в производительности, но и в логичности. Синглтон «кэширует» свой экземпляр в своем собственном статическом поле, поэтому он также является логически кэшем.
А у вашего кеша должна быть логика сохранения одиночного кода, которой нет у большинства кешей.
Распределенные сценарии - это отдельная история, но в этом случае вы должны кэшировать данные, а не экземпляр.