Abstract Type Design