I'd argue that a transparent wrapper would be more confusing. We couldn't possibly cover all use cases with that bu we'd set up wrong expectations that a Cached[T] should always behave just lust a T. At least the explicit monad is a clean abstraction. In practice, there are probably not many use cases for this anyway. How often do you want to cache both a base query and another query derived from it? Usually you'll only want to cache the final queries.