Too many nested Types?
You should "lift" your functions instead.

For example, instead of defining:

def getSomething(input: V): Future[FinalType] = {
   val intermediate: IntermediaryType = complicatedFunctionReturningFuture(input)
   mappingFunction(intermediate)
}


use

complicatedFunctionReturningFuture(input).map(mappingFunction)


directly in your code.

You can think of map as a method that is lifting a function IntermediaryType =&gt; FinalType to a function Future[Intermediary] =&gt; Future[FinalType].

If you have a Future[Try[Type]], you can do a "double lifting" (I'm claiming the trademark on that term!):

complicatedFunctionReturningFutureTry(input).map(_.map(mappingFunction))


which lifts the same function IntermediaryType =&gt; FinalType to a function Future[Try[Intermediary]] =&gt; Future[Try[FinalType]].