D enums are not the good kind of enums (i.e. sum types, like in Rust), though. Instead they have some silly implementation of sum types using classes in std.variant.
But sure, I would agree that having a natively implemented variant type would be better, even if this one can serve many of the same purposes.
Class = reference type, supports polymorphism, inheritance
Struct = value type, does not support polymorphism, inheritance
The variant type based on a struct is implemented through the language's metaprogramming facilities.
ironically, i haven't really used D for the same reason i haven't really used rust - i've yet to have a project for which ocaml wasn't a better choice. (i know both D and rust address things ocaml doesn't, but they aren't the things i tend to need for my personal projects.)