Objective-C-ben a C-ben megszokott típusokat használhatjuk, azzal a kivétellel, hogy egyrészt nem támogatja a long double típust, és sima double-ként kezeli, másrészt egy új típust is bevezettek: az id típust. Minden objektum típusa id, amikor pedig az objektumot használjuk, dinamikusan, futási időben derül ki a pontos típusa (hogy melyik osztály példánya). Harmadrészt bevezeti a BOOL típust, aminek értéke YES vagy NO lehet.
A diszkrét típusok a C-ben megszokott egész típusok:
A valós típusok a C-ben megszokott valós típusok:
Minden objektum id típusú, így futási időben, dinamikusan dől el az adott objektum típusa, ha ezen keresztül akarjuk elérni. Használhatjuk azonban a * operátort is, amivel a fordítónak fordítási időben explicit információt adunk egy objektum típusáról, ugyanúgy, mint a C-ben. Amíg az id mutatót definiál egy objektumra, ami bármi lehet, a * operátorral statikusan rendelünk típust a változóhoz, tulajdonképpen mutatót egy osztályra. Ha dinamikusan érjük el az objektumot, akkor csak futási időben dől el, ha például nem lehet neki egy adott üzenetet elküldeni, míg ha statikusan, akkor, mivel az objektum típusa ismert, már fordítási időben.
A C-ben megszokott típuskonstrukciós lehetőségek használhatóak, az Objective-C új típuskonstrukciós lehetőségként bevezeti az osztályt.