Hm, reminds me of this thread: Why do "an object can be x" and "repeat with o running through objects" refer to different sets of objects?
I haven’t reproduced either case, but I bet this is the deal:
If you say “A thing can be foo”, and then check for “a foo room”, you expect this to silently match nothing (because rooms can’t be foo). If you check for “a foo object”, you expect this to match things but reject rooms.
But I guess that’s not guaranteed? If the foo either-or property is implemented as an I6 attribute, that’s how it works. But if it’s implemented as an I6 property, the rejections aren’t silent; they throw “tried to read (something)” runtime errors.
I don’t know whether this contradicts the documentation or just our assumptions.
(Also I don’t know if I’ve described the previous thread exactly right. It’s late.)