Lua è un linguaggio tipizzato in modo dinamico. Non ci sono definizioni di tipo nella lingua; ogni valore porta il suo proprio tipo.

Ci sono otto tipi di base in Lua: nil, booleano, numero, stringa, userdata, funzione, filo, e tavolo. Il tipo di funzione fornisce il nome di un determinato valore di tipo:

stampa (tipo ("Ciao mondo")) -> string
stampa (tipo (10,4 * 3)) -> Numero
stampa (tipo (stampa)) -> Funzione
stampa (tipo (tipo)) -> Funzione
stampa (tipo (true)) -> booleano
stampa (tipo (nil)) -> nil
stampa (tipo (tipo (X))) -> string

L'ultimo esempio si tradurrà in "stringa" non importa il valore di X, perché il risultato del tipo è sempre una stringa.
Le variabili non hanno tipi predefiniti; ogni variabile può contenere valori di qualsiasi tipo:

stampa (tipo (a)) -> nil (`a 'non è inizializzata)
a = 10
stampa (tipo (a)) -> Numero
a = "una stringa !!"
stampa (tipo (a)) -> string
a = stampa - sì, questo è valido!
un (tipo (a)) -> funzione

Notate le ultime due righe: le funzioni sono valori di prima classe in Lua; così, siamo in grado di manipolarli come qualsiasi altro valore. (Più su che in capitolo 6.)
Di solito, quando si utilizza una sola variabile per i tipi diversi, il risultato è il codice disordinato. Tuttavia, a volte l'uso giudizioso di questa struttura è utile, per esempio nell'uso di nil differenziare un normale valore restituito da una condizione eccezionale.