Por que eu posso anonimamente subclassificar um enum mas não uma aula 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);
    }
}

impressões:

Eu sou o valor

No entanto, 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";
            }
        });
    }
}

resulta em um erro de compilação:

cannot inherit from final HelloWorld.C

Por que podeE.VALUE criar o que parece ser um anônimoE subclasse, sobrepondo otoString método, enquanto usando uma classe final em vez de um enum implicitamente final lança um erro de tempo de compilação?

Mais especificamente, por queVALUE substituir tudo emE? Fiquei com a impressão de que o código

public enum E {
    VALUE;
}

foi aproximadamente equivalente a

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

caso em que a natureza anônima não seria permitida.

Qual é a diferença? Por que as enums são especiais?

questionAnswers(3)

yourAnswerToTheQuestion