In V7 Unix — where the Bourne shell made its debut — [ was called test, and it existed only as /bin/test. So, code you would write today as:
if [ "$foo" = "bar" ] ; then ...
you would have written instead as
if test "$foo" = "bar" ; then ...
This second notation still exists, and makes it clearer what's going on: you are calling an external program called test, which evaluates its arguments and returns a code that if uses to decide what to do next.
An interesting point here is that because it names an external program — which may be shadowed by a builtin — [ isn't like the punctuation characters you see in other languages. You must put spaces around it to separate it from the rest of the expression, for the same reason that you cannot write iftest"$x"...
The alias of test to [ came later,¹ and test was extended to cope with the extra trailing ] character, which exists purely for symmetry.
There is also a program on your system called /bin/[ by the way, which is used by shells that do not have [ built in.
None of that history affects [[, because there never was a primordial program called [[. It exists purely inside those shells that implement it as an extension to the POSIX shell.
As to the distinction between "builtin" and "keyword," that is purely due to this history. "Builtin" means that it is shadowing an external program, whereas "keyword" is a thing that exists purely inside the shell. This distinction matters, because it affects behavior. Many shells' built-in echo implementation behaves differently from /bin/echo, for example, so you must be careful to make a distinction about whether you're talking about the builtin vs the external program. No such distinction needs to be made about a keyword.
Footnotes:
- It happened around 1980. /bin/[doesn't exist in my copy of Ancient Unix V7 from 1979, nor doesman testdocument it as an alias. In the corresponding man page entry I have in a pre-release copy of the System III manual from 1980, it is listed.