Removing asInstance[T] from scala code
There is no implicit inference that S = S[S,T] = Problem[S,T]. But you can add an explicit one:

abstract class Problem[T &lt;: SolutionFinder[S, T], S &lt;: Problem[T, S]](solutionFinder: T) {
  this: S =&gt;
    def solve(): Unit = solutionFinder.findSolution(this)
}


A better design might be to disentangle the Problem and Solution. Perhaps the solve could be moved out of Problem, and require the Solution only at the point of use?

trait Problem
trait Solution[P &lt;: Problem] {def solve(p: P): Unit }
class ConcreteProblem extends Problem
class ConcreteSolution extends Solution[ConcreteProblem]
def solve[P &lt;: Problem](p: P, s: Solution[P]) = s.solve(p)


If you need a more sophisticated relation between Problem and Solution, you could create a typeclass for the "relationship", with implicit instances available:

trait KnowsHowToSolve[P &lt;: Problem, S &lt;: Solution] {
  def solve(p: P, s: S): Unit
}
implicit object ConcreteProblemKnowsHowToSolveConcreteSolution extends KnowsHowToSolve[ConcreteProblem, ConcreteSolution] {
  def solve(p: ConcreteProblem, s: ConcreteSolution) = s.findSpecificSolution(p)
}
def solve[P &lt;: Problem, S &lt;: Solution](p: P, s: S)(implicit ks: P KnowsHowToSolve S) = ...