Use an abstract type member instead of a method-level type parameter

It's error prone to rely on the user to specify the type of a member we already know. Using an abstract type member solves this problem quite nicely, while also improving the API usability.

Ideally we would have changed the existing "underlying" method, but it can't be done without breaking existing clients of the framework.

A future version may deprecate the methods introduced in this commit and change the "underlying" methods to return the abstract type member.