A Luában absztrakt adattípusok létrehozására nyelvi eszközök nem állnak rendelkezésre. Azonban táblák segítségével eljárások ill. változók egy egységbe zárhatók, ami lehetőséget ad adattípus megvalósítására. Habár az implementáció és a specifikáció nem választható külön, a reprezentáció elrejthető a táblában lokális változók felhasználásával. Az így kapott konstrukció hasonló tulajdonságokkal rendelkezik, mint egy absztrakt adattípus, de mégsem az, hiszen nem egy új nyelvi típust definiáltunk ilyen módon, csupán eljárások egy gyűjteményét. A Lua lehetővé teszi modulok létrehozását: egy táblát tárolhatunk egy külön fájlban. Továbbá ez a mechanizmus biztosítja a névtereket is, hiszen egy függvényt csak úgy hívhatunk, ha minősítjük az őt tartalmazó tábla nevével.
Az így létrehozott típusok minél kényelmesebb használatát célozzák a metatáblák, amik lényegében az operátorok túlterhelését teszik lehetővé Luában. Minden tábla objektumhoz lehet rendelni egy metatáblát, ami az adott objektumhoz tartozó műveleteket írja le. A metatábla ettől eltekintve egy közönséges tábla, a kulcsai a műveletek nevei, az értékei pedig a műveleteket elvégző függvények. Példaként egy rendeljünk egy táblához egy összeadás műveletet:
A cplx_meta metatáblával rendelkező táblák, ha van re és im mezőjük, olyan komplex számokat reprezentálnak, amiket a + operátorral össze lehet adni. Hasonló módon lehet definiálni minden Lua operátor jelentését (a logikai operátorokon kívül), beleértve a relációs jeleket, például az egyenlőségvizsgálatot is. Az operátorokon kívül a tömb-indexelést is át lehet definiálni (külön kell megadni az értékadást és az érték lekérdezését).