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.