 <p>I don't claim to fully understand the <em>why</em> here, but as best I can tell, this is what's going on.</p> <p><code>summary.default</code> actually calls <code>oldClass</code> rather than <code>class</code>. <em>Why</em> I'm not sure, although I'm sure there's a good reason. </p> <p>Somewhat cryptically in <code>?class</code> we find the following passages:</p> <blockquote> <p>Many R objects have a class attribute, a character vector giving the names of the classes from which the object inherits. <strong>If the object does not have a class attribute, it has an implicit class, "matrix", "array" or the result of mode(x) (except that integer vectors have implicit class "integer").</strong> (Functions oldClass and oldClass&lt;- get and set the attribute, which can also be done directly.)</p> </blockquote> <p>So what's going on here is that <code>class</code> returns the <em>implicit</em> class (numeric). Note that <code>attr(a$alpha,"class")</code> returns <code>NULL</code>. Since the attribute doesn't exists, <code>oldClass</code> faithfully returns <code>NULL</code>.</p> <p>As for the differences between mode, type and class, the first two are related, the third is sort of a separate idea. Mode and type are (I think) actually fairly well explained in the documentation. <code>mode</code> tells you the storage mode of an object, but it is relying on the result of <code>typeof</code>, so they are (mostly) the same. Or connected, at least. But the different values that <code>typeof</code> returns are simply collapsed down to a smaller subset.</p>