1) check-function is safe to use on untyped functions.2) check-function can be trivially improved to reject all untyped functions3) The lambda list for the function defun* creates is helpful, though still limited.4) It automatically checks to make sure the function was given the right types.

I'm thinking of making a simple prototype-based object system based on the above technique.