1/ Paměť neřeším. To ať si vyřeší kompilátor.
Nejde o paměť, ale o typ. Referenci na Age nesmíš změnit na referenci na Int. Ledaže bys měl čítač referencí a ten byl roven jedné.
Předpokládám ale, že uvažuješ o nějakém Haskell-like jazyku, tak na reference prdíme.
Ano, to jsem dostatečně nezdůraznil.
2/ Mě se tam žádnej typ nezměnil. O žádnou informaci jsem nepřišel. Já mám pole Intů. Mám funkci:
No pokud se na to díváš takhle, tak ano, máš pole intů. V tom případě jsi o tu informaci, že "a" je "Age" přišel ve chvíli, kdy jsi "a" vložil do toho pole intů. Tím se totiž z Age stal Int = ztratil jsi informaci o tom, že to číslo je kladné. Odteď už to nevíš.
Nebo řečeno jinak: intuitivně člověk asi očekává, že když do listu něco vloží a pak to z něj vyndá, dostane to samý. Ty ale říkáš, že dostane typ prvku toho listu.
Ne tak docela.
V 
List Int může být cokoliv, co se vejde do 
Int. Takže i 
Age. Když do 
List Int dám 
Age, tak smím, a bude tam 
Age, neproběhne konverze (nedělal bych to). Když ale z 
List Int čtu, tak sice můžu zjišťovat, zda nejde o nějaký podtyp, ale nemůžu k tomu přistupovat jako k 
List Age, protože je to 
List Int. Kompilátor mi bude hlídat, abych k těm položkám nepřistupoval jako k 
Age, protože tam samozřejmě může být 
Int, a obráceně to už nejde.
Možná trochu zmatenej popis, ale tak viz ten můj Haskell like kód.
Jak jsem říkal, nejsou to neřešitelné problémy, ale je to opruz.
Pokud tě napadá nějaký příklad, stál bych o něj.