I think Dave has already replied to this in the most accurate possible way - separation of concerns!
Simply put, UVM testbenches are built from classes derived from the uvm_component base class. They are building blocks mostly of similar types - drivers, monitors, agents - require hierarchy, phasing mechanisms, configuring capabilities etc.,. UVM library helps end users by providing standard methods (embedded in uvm_component) to support these functional requirements.
On the other hand the transactions and configs are end-user-specific. There is no requirement for standardization there. All it needs is hooks for sequencers and body method, which one can implement as per their specific needs. Sequence layering is used for complex sequences but it too never requires hierarchy methods or phasing methods or any of the component-specific methods.
UVM thus helps here by keeping the hierarchy structures and data structures separate, aiding in building simpler, manageable and uncomplicated testbenches.