Looking at R source code (names.c) :
{"is.null", do_is, NILSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.logical", do_is, LGLSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.integer", do_is, INTSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.double", do_is, REALSXP,1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.complex", do_is, CPLXSXP,1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.character", do_is, STRSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.symbol", do_is, SYMSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.name", do_is, SYMSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.environment",do_is, ENVSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.list", do_is, VECSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.pairlist", do_is, LISTSXP,1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.expression", do_is, EXPRSXP,1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.raw", do_is, RAWSXP, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.object", do_is, 50, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"isS4", do_is, 51, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.numeric", do_is, 100, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.matrix", do_is, 101, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.array", do_is, 102, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.atomic", do_is, 200, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.recursive", do_is, 201, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.call", do_is, 300, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.language", do_is, 301, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
{"is.function", do_is, 302, 1, 1, {PP_FUNCALL, PREC_FN, 0}},
...
shows that objects(50) are a specific type, different from function(302), or other types (numeric, matrix,...)
This is confirmed in definition of do_is in coerce.c:
case 50: /* is.object */
LOGICAL0(ans)[0] = OBJECT(CAR(args));
break;
Objects have the following methods:
/* Objects */
{"inherits", do_inherits, 0, 11, 3, {PP_FUNCALL, PREC_FN, 0}},
{"UseMethod", do_usemethod, 0, 200, -1, {PP_FUNCALL, PREC_FN, 0}},
{"NextMethod", do_nextmethod, 0, 210, -1, {PP_FUNCALL, PREC_FN, 0}},
{"standardGeneric",do_standardGeneric,0, 201, -1, {PP_FUNCALL, PREC_FN, 0}},
Which points to base R documentation :
R possesses a simple generic function mechanism which can be used for an object-oriented style of programming. Method dispatch takes place based on the class(es) of the first argument to the generic function or of the object supplied as an argument to UseMethod or NextMethod.
This shows that objects of type 50, detected by is.object, are simply S3 classes or S4 classes, and is confirmed by is.object documentation:
is.object - Is an object internally classed? It returns TRUE if the object x has the R internal OBJECT bit set, and FALSE otherwise. The OBJECT bit is set when a "class" attribute is added and removed when that attribute is removed, so this is a very efficient way to check if an object has a class attribute. (S4 objects always should.)
In short : an internal object has the class attribute set.
This is quite restrictive compared to objects in common language.
Not sure R documentation always means objects(50) when speaking about objects.
Regarding names(function()) error, see clarification by @nicola.