Following 513.1490, isobj has been in a weird place semantically and in the shared code I'm familiar with, #define isobj(A) istype(A, /obj) is a correction included by rote. Perhaps it shouldn't have to be.
For anyone unfamiliar and skimming:
/atom/movable/foo/name = "foo"
/mob/verb/Test()
usr << "O [isobj(new /obj)]"
usr << "M [isobj(new /mob)]"
usr << "AM [isobj(new /atom/movable)]"
usr << "AMF [isobj(new /atom/movable/foo)]"
O 1
M 0
AM 1
AMF 1
M 0
AM 1
AMF 1
I understand the internal reason given prior bug reports (eg1 eg2) but going by the documentation ("1 if all args are valid objs; 0 otherwise") it's reasonable to assume isobj(x) == istype(x, /obj) where instead the result is like isobj(x) == ismovable(x) && !ismob(x) - quite a pitfall given years have passed and user defined AM children are used.
I feel "obj means /obj" probably holds all the mindshare. Making isobj(x) an alias for (and subbing in as many as required) istype(x, /obj) even with no other wins would be an improvement.