Yeah, classes are generally better than branded types for objects (unless you're just building discriminated unions).
What's particularly better these days is that you get nominal typing and brand checks with standard private fields:
class Foo {
#brand;
static isFoo(o): o is Foo {
return #brand in o;
}
}