原です。

|... +!(other) の定義を
|a, b = other.coerce(self, :+!); b + a; みたいにしておきます。

ここはやはり複雑過ぎますね。a + b も b +! a も知らなければ
あきらめるのがシンプルでいい気がしてきました。

つまり反対演算があるなら、coerce は廃止したほうがいいので
はないかと。