You overlook the complex second distinction between classes and structs.
According to the specification (11.2.2 for C++98 through C++11):
When a derived class is declared as a struct (without an access-specifier), public is presumed, whereas when a class is specified as a class, private is assumed.
And just to be thorough, (11.2) defines the more well-known distinction between class and struct as follows:
By default, members of a class specified with the term class are private.
The default access level for members of a class declared with the keywords struct or union is public.
Another distinction is that the keyword class can be used to declare template arguments, whereas the keyword struct cannot.