Eu falei “em média”, ou seja, o caso normal (feijão com arroz, ou em inglês, “bread & butter”) de você usar só constantes no seu “enum”.
enum Cores {
VERMELHO, LARANJA, AMARELO, VERDE, AZUL, ANIL, VIOLETA
};
Se você investigar os bytecodes gerados por esta função que usa a enum acima (use o javap):
public String (Cores c) {
switch (c) {
case VERMELHO: return "red";
case LARANJA: return "orange";
case AMARELO: return "yellow";
...
}
}
você vai ver que é gerado um código análogo ao que seria gerado se usássemos constantes definidas com “public final static int”.
Agora se você puser métodos, atributos e outras coisas, vai ficando pesado igual a uma classe normal. É questão de ver o que normalmente se usa (enum simples, sem frescuras) e o que é possível fazer (como o exemplo do Joshua Bloch mostra, é possível fazer umas coisas muito pouco intuitivas com enums - acho que ele viajou um pouco quando ele definiu as enums no Java.)