`basetype` should already support an iterable (or at least a sequence), although perhaps the name could reflect that better.

But beyond that, you're right, `basetype=basestring` (or, equivalently, `basetype=(basestring,)`) would allow removing the special-casing for defaults.