I would say
inherits(df,"data.frame")
or
is(df,"data.frame")
among other things, #2 in your list can fail because (as you suggest in #3) class(df)
can have length > 1. (is.data.frame
is nice, but not all classes have is.
methods: see methods("is")
)