One early experiment was the idea of block scoping, which permitted functions to be arbitrarily nested one within the other. Block scoping appears in the language ALGOL 60, an ancestor of Simula, Pascal, and many other languages.
One might think that block scoping would provide a better mechanism for information hiding, however this turns out to not be true. If a data area is shared by two or more procedures, it must still be declared in a more general scope than the procedures, and thus be even more exposed than the procedures will be.
The language C broke with the general trend towards block scoping, returning to the idea of only two levels of scope (global and local). Many subsequent languages have followed this trend.