Ok, então é melhor explicar o seu acréscimo, e porque não deixei o método sincronizado.
Você tem duas opções ao fazer um singleton:
a) Inicializar diretamente a variável instance, como eu fiz ali. Nesse caso, a inicialização é garantida pela VM e não há necessidade do método getInstance() ser syncronized, já que duas threads nunca irão solicitar a construção da instância ao mesmo tempo. Por outro lado, sem lazy loading a sua classe singleton será criada assim que a classe for carregada pela VM, não quando for usada pela primeira vez (entretanto, normalmente a VM só carrega a classe quando for usada pela primeira vez).
b) Usar lazy loading. Só uma correção no código do colega (copy&paste tem disso, heheh), o atributo instance deverá ser inicializado com null (lauden, usei meus “superpoderes” de moderador e já corrigi ali em cima). No caso do lazy loading, é o método getInstance() que chama o new, desde que a instância ainda não tenha sido criada. Por outro lado, agora é necessário garantir thread safety, já que duas threads podem chamar esse método ao mesmo tempo e, numa condição de concorrência, duas instâncias poderiam ser criadas, quebrando o padrão e gerando um erro realmente estranho. Por isso, no caso de lazy loading, use o método getInstance() sincronizado.
Eu geralmente prefiro a primeira forma. O código fica mais simples, a sincronização é garantida, e pouquíssimas vezes ela acaba inicializando o singleton antes do primeiro uso. A segunda, deixe reservado para classes que realmente ocupam muita memória, ou que serão pré-inicializadas pela VM de alguma forma.
Veja também as desvantagens do padrão singleton, e entenda-as antes de usa-lo:
a) O padrão não funciona com multiplos class-loaders. Isso é especialmente problemático em aplicações web, já que os servidores de aplicação efetivamente usam múltiplos classloaders;
b) O singleton nunca é destruído. Uma vez criado, ele ocupa memória para sempre. Muito cuidado se o seu singleton permitir a adição de listeners, ou contiver listas de outros objetos. Tudo que o singleton referenciar também não será destruído. É muito comum que singletons (e variáveis estáticas no geral) estiquem seus tentáculos e gerem memory leaks difíceis de corrigir.
c) Geralmente existem outros padrões melhores: caches, registry, fábricas, etc. Afinal, o singleton deveria ser usado quando você quer uma única instância na aplicação toda, não quando você quer deixar uma classe globalmente acessível, ou referencia-la de maneira prática. Esses dois últimos efeitos são só efeitos colaterais, não devem ser a motivação.