I have thought about this a little more and come to the conclusion that you cannot define a metaclass that creates type objects that have more C slots than the standard type object lay-out. It would be the same as trying to add a C slot to the instances of a string subtype: there's variable-length data at the end, and you cannot place anything *before* that variable-length data because all the C code that works with the base type knows where the variable length data start; you cannot place anything *after* that variable-lenth data because there's no way to address it from C.
It's a pity, isn't it?
A better solution is to store additional information in the __dict__.
You loose nice features: access these (new) slots from Python by providing tp_members entries for them (for example).
Are you planning to address this issue in the future?