A way to tell them apart is the presence of the EnumTag, if it's present, then the enum is a new type: enum V1 = 10; enum { V2 = 20 } enum Foo { V3 } void main() { assert(V1 == 10); // OK assert(V2 == 20); // OK assert(Foo.V3 == 0); // ERROR, type mismatch } Bye, bearophile