Einfache Antwort: Wie du schon sagst kann man Option als einen Container der Länge null bis eins auffassen, z.B. kann man option.foreach(println) schreiben (was dann eben den Inhalt x von Some(x) druckt, oder gar nix bei None). Man kann aber z.B. auch "Surprise".foreach(println) schreiben, ohne dass String eine Collection-Klasse wäre.
Komplizierte Antwort: Container-Typen wie Option gehören (unabhängig davon, wie sich die Klassenhierarchie gestaltet) strukturell zu den
Monaden, und auf diesen lassen sich sehr abstrakt bestimmte nützliche Operationen (wie map, flatMap, flatten, filter, foreach ...) definieren, die sich in den konkreten Typen unterschiedlich, aber konsistent verhalten.