Alright, having thought some more here, I think we are sort of full circle.

trait Bytes {
	def ++ (bytes: Bytes): Bytes
        def isCompact: Boolean
        def compact: Bytes
}
trait ByteString extends Bytes {
	def ++ (bytes: Bytes): Bytes = bytes match {
          case b: ByteString => ++(b)
          case other => …
        }
	def ++ (bytes: ByteString): BytesString
}
trait FileBytes extends Bytes {
	def ++ (bytes: Bytes): Bytes
}

CompoundBytes and ByteStrings should never ever be seen by the users, so no need to have SimpleBytes.
So we get 2 rope-like structures I guess, but it will be completely invisible to users.

Do you agree?