Eh.. I wrote a 1000 line linux "system" application in D. Didn't use a single class. All enums and structs pretty much like you would approach it like good "C" programmer while still using all of D's goodness.
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.)