¿Por qué puedo subclasificar anónimamente una enumeración pero no una clase final?

Este código:

public class Sandbox {
    public enum E {
        VALUE {
            @Override
            public String toString() {
                return "I'm the value";
            }
        };

        @Override
        public String toString() {
            return "I'm the enum";
        }
    }
    public static void main(String[] args) {
        System.out.println(E.VALUE);
    }
}

huellas dactilares:

Yo soy el valor

Sin embargo, este código:

public class Sandbox {
    public static final class C {
        @Override
        public String toString() {
            return "I'm a C";
        }
    }

    public static void main(String[] args) {
        System.out.println(new C() {
            @Override
            public String toString() {
                return "I'm anonymous";
            }
        });
    }
}

da como resultado un error de compilación:

cannot inherit from final HelloWorld.C

Porque puedeE.VALUE Crea lo que me parece ser anónimo.E subclase, anulando latoString método, mientras se usa una clase final en lugar de una enumeración implícitamente final, ¿se produce un error en tiempo de compilación?

Más específicamente, ¿por qué puedeVALUE anular cualquier cosa enE? Tenía la impresión de que el código

public enum E {
    VALUE;
}

era aproximadamente equivalente a

public static final class E {
    public static final E VALUE = new E();
}

en cuyo caso no se permitiría la naturaleza anónima.

¿Cual es la diferencia? ¿Por qué los enums son especiales?

Respuestas a la pregunta(3)

Su respuesta a la pregunta