All the non-primitive wired-in things are also defined in GHC's libraries, because even though GHC knows about them we still need to generate code for them. For example, Bool is a wired-in type constructor, but it is still defined in GHC.Base because we need the info table etc for the data constructors. Arbitrarily bad things will happen if the wired-in definition in compiler/prelude/TysWiredIn.hs differs from that in the library module.
The point about known-key things is that GHC knows its name, but not its definition. The definition must still be read from an interface file as usual. The known key just allows an efficient lookup in the environment.
When reading an interface file, GHC might come across "GHC.Base.Eq", which is the name of the Eq class. How does it match up this occurrence in the interface file with eqClassName defined in PrelNames? Because the global name cache maintained by the renamer is initialised with all the known-key names. This is done by the (hard-to-find) function HscMain.newHscEnv: