+1.

I'd suggest something like:

message match {
  case sm: SystemMessage if shouldStash(sm) => stash(sm)
  case f: Failed => ...
  ...
}

shouldStash can be very efficiently implemented for the normal case:

    def shouldStash(sm: SystemMessage): Boolean =
      (state: @switch) match {
        case `DefaultState` => false
        case `SuspendedState` => sm.isInstanceOf[Failed]
        case `SuspendedWaitForChildrenState` =>
          sm.isInstanceOf[Failed] || sm.isInstanceOf[Recreate] || sm.isInstanceOf[Suspend] || sm.isInstanceOf[Resume]
      }
  
Wdyt?