Na maioria das linguagens de programação, as classes fogem muito do sistema de tipos. Embora uma classe, com seus métodos e variáveis estáticos, seja um objeto, muitas vezes ela não pode implementar uma interface ou estender outras classes. Por esse motivo, não pode ser usado de forma polimórfica, pois não pode ser o subtipo de outro tipo. Por exemplo, se você tiver uma interface IFooable, que é exigida por várias assinaturas de método de outras classes, o objeto de classe StaticFoonão pode ser usado no lugar de IFooable, ao passo que FooSingleton.getInstance()pode (assumindo, FooSingletonimplementa IFooable).
Observe que, como comentei na resposta de Heinzi, um singleton é um padrão para controlar a instanciação. Ele substitui new Class()por Class.getInstance(), o que dá ao autor Classmais controle sobre as instâncias, que ele pode usar para evitar a criação de instâncias desnecessárias. O singleton é apenas um caso muito especial do padrão de fábrica e deve ser tratado como tal. O uso comum torna-o mais o caso especial de registros globais, que muitas vezes acabam mal, porque os registros globais não devem ser usados à toa.
Se você planeja fornecer funções auxiliares globais, os métodos estáticos funcionarão bem. A classe não atuará como classe, mas apenas como um namespace. Eu sugiro que você preserve a alta coesão ou pode acabar com os problemas de acoplamento mais estranhos.
greetz
back2dos