Fornecer uma implementação padrão de compareTo que usa a ordem do código-fonte está bom; torná-lo final foi um erro da parte da Sun. O ordinal já responde pela ordem de declaração. Eu concordo que na maioria das situações um desenvolvedor pode apenas ordenar logicamente seus elementos, mas às vezes alguém quer o código-fonte organizado de uma maneira que torne a legibilidade e a manutenção fundamentais. Por exemplo:
//===== SI BYTES (10^n) =====//
/** 1,000 bytes. */ KILOBYTE (false, true, 3, "kB"),
/** 106 bytes. */ MEGABYTE (false, true, 6, "MB"),
/** 109 bytes. */ GIGABYTE (false, true, 9, "GB"),
/** 1012 bytes. */ TERABYTE (false, true, 12, "TB"),
/** 1015 bytes. */ PETABYTE (false, true, 15, "PB"),
/** 1018 bytes. */ EXABYTE (false, true, 18, "EB"),
/** 1021 bytes. */ ZETTABYTE(false, true, 21, "ZB"),
/** 1024 bytes. */ YOTTABYTE(false, true, 24, "YB"),
//===== IEC BYTES (2^n) =====//
/** 1,024 bytes. */ KIBIBYTE(false, false, 10, "KiB"),
/** 220 bytes. */ MEBIBYTE(false, false, 20, "MiB"),
/** 230 bytes. */ GIBIBYTE(false, false, 30, "GiB"),
/** 240 bytes. */ TEBIBYTE(false, false, 40, "TiB"),
/** 250 bytes. */ PEBIBYTE(false, false, 50, "PiB"),
/** 260 bytes. */ EXBIBYTE(false, false, 60, "EiB"),
/** 270 bytes. */ ZEBIBYTE(false, false, 70, "ZiB"),
/** 280 bytes. */ YOBIBYTE(false, false, 80, "YiB");
A ordem acima parece boa no código-fonte, mas não é como o autor acredita que compareTo deve funcionar. O comportamento desejado compareTo é ter a ordenação por número de bytes. A ordem do código-fonte que faria isso acontecer degrada a organização do código.
Como cliente de uma enumeração, não poderia me importar menos como o autor organizou seu código-fonte. Eu quero que seu algoritmo de comparação faça algum sentido, no entanto. A Sun colocou desnecessariamente os escritores de código-fonte em um beco sem saída.