Como já foi mencionado, até certo ponto, uma enum é uma classe java com a condição especial de que sua definição deve começar com pelo menos uma "constante enum".
Além disso, e que enum não podem ser estendidos ou usados para estender outras classes, um enum é uma classe como qualquer classe e você a utiliza adicionando métodos abaixo das definições constantes:
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
Você acessa os métodos do singleton ao longo destas linhas:
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
O uso de um enum, em vez de uma classe, é, como foi mencionado em outras respostas, principalmente sobre uma instanciação segura do thread do singleton e uma garantia de que sempre será apenas uma cópia.
E, talvez, o mais importante, que esse comportamento seja garantido pela própria JVM e pela especificação Java.
Aqui está uma seção da especificação Java sobre como várias instâncias de uma instância enum são impedidas:
Um tipo de enumeração não possui instâncias diferentes daquelas definidas por suas constantes de enumeração. É um erro em tempo de compilação tentar instanciar explicitamente um tipo de enum. O método de clone final no Enum garante que as constantes do enum nunca possam ser clonadas e o tratamento especial pelo mecanismo de serialização garante que instâncias duplicadas nunca sejam criadas como resultado da desserialização. A instanciação reflexiva dos tipos de enum é proibida. Juntos, essas quatro coisas garantem que não existam instâncias de um tipo de enumeração além daquelas definidas pelas constantes de enumeração.
É importante notar que, após a instanciação, qualquer preocupação com a segurança do encadeamento deve ser tratada como em qualquer outra classe com a palavra-chave sincronizada etc.