Is there any sort of formal definition of terms like 'data type', 'abstract data type', etc?
I good starting point is Benjamin Pierce's Types and programming languages (popularly referred to as "TAPL").