Обычно, когда говорят, что enum плох, то имеют в виду что он не несёт в себе дополнительного поведения. Т.е. его нельзя расширить, добавить новую семантику, самопроверку и прочее. Так, для тех же единиц измерения помимо самого имени в enum (Units.Watt) нужно ещё иметь обычно выводимое имя (Ватт), способ конвертирования и ещё чего-нибудь. Поэтому в этом случае общая рекомендация состоит в создании иерархии классов, наследуемых от общего абстрактного класса.
Например:
public abstract class Unit
{
int _enumValue;
public string Name {get;private set; }
implicit operator int(Unit value) {return this._enumValue; } // обычно нужно для сохранения во внешнем хранилище или передаче по сети - по сути аналог обычного enum
// ... и т.д.
}
public class Watt : Unit {
Watt() { Name = "Ватт"; }
}
К этому ещё надо подключать фабрику для их восстановления из int и что-то ещё насколько я помню. Где я про это читал сейчас не могу вспомнить - но смысл такой.