> Of course we can, ++ returns Bytes, ByteString overloads it to return ByteString, which is fine, since ByteString IS-A Bytes.

We then still need two implementations for combination to satisfy the types:

```scala
case class ByteStrings(byteStrings: Seq[ByteString]) extends ByteString /* extends Bytes */
case class CompoundBytes(bytes: Seq[Bytes]) extends Bytes
```

That's pretty much the same as we have here.

> What does the above mean concretely?

See the [implementation in TcpConnection](https://github.com/akka/akka/pull/1900/files#diff-a5f97495edf7e5e84e3a097d35f1064eR352) above. I don't care how the API looks like exactly. Right now it's the extra `case class CompoundBytes` which I can match on. Another method on Bytes `def compactParts: Seq[CompactBytes]` where CompactBytes is either a `ByteString` or `FileBytes` would also be good enough.