There is a lot of code duplicated in convenience methods in each hash implementation, and having a generic hash type makes implementing higher-level constructs such as HMAC significantly easier down the road.
In an perfect world these would just be removed, but the world is imperfect, and people are forced to interact/interface with things that are broken.