Personally, I strongly recommend using namespaces, especially as your project grows.
The internal keyword, though, won’t actually confine accessibility to a namespace, but instead confines scope to a given assembly. As it stands right now, we’re not using Assembly Definitions within any of our courses codebases. This means that all of our scripts are in the Assembly_CSharp assembly. In this context, internal is effectively the same as public.
There are currently no ways in C# to restrict a variable’s scope to a namespace. If another class references the namespace and class, they can access a public (or internal) variable within that namespace (unless that namespace is contained within a different assembly, in which case you can’t access internal objects in another assembly, but you can always access public objects).