Argument type validation with user-friendly error messages

Include `set` here as well?