Az Elm egy szigorúan típusos nyelv, emellett rendelkezik típuskikövetkeztető rendszerrel, azaz a típusok megadása nem kötelező a programszövegben.
Hatékonysági szempontból beépített típusok az Int, Float, Char és a String. Ezek a beépített típusok nem rögzített méretűek, azaz tetszőlegesen nagy számok megadhatók az Int típussal például.
A listában tetszőleges számú, azonos típusú elemeket tárolhatunk, szintaxisa nagyban hasonlít a Haskell-ben lévő listákéhoz. Az üres lista konstruktora a [], az elem hozzáfűzésé pedig a :: operátor. Listák többféleképp is megadhatók egyszerűen, például ez a négy kifejezés ekvivalens:
A nyelv támogat kiegészíthető rekordokat (extensible record), amik hasonlítanak a JavaScript-ben lévő object-ekhez. Néhány példa:
Ezeknek az elemeit a . operátorral tudjuk elérni, azaz:
A rekord elemeire mintát illeszthetünk, példaként egy függvény, ami olyan rekordokat vár paraméterül, amik tartalmaznak x és y mezőket:
Rekordok mezőit tudjuk frissíteni a következő szerkezettel:
A nyelvben új típusokat adhatunk meg algebrai adattípusokként, szintaxisa megegyezik a Haskell-ből ismerttel. Itt konstruktorokat sorolunk fel, amikre aztán mintát illeszthetünk.