Yeah multiple inheritance has its can of worms. Gauche employs CLOS-style multiple inheritance, and typical compounding patterns conditions are handled with mixin inheritance. To make it work, though, you have to design condition type hierarchy very carefully. Compounding, on the other hand, can be very loose, but one can adapt it to various infrastructures (simple non-inheritance record system, single inheritance type system, or multi-inheritance system.)
I browsed John's compound objects. It is simple but I'm afraid it gets too low-level to fit into implementation's existing type system, other than predicate-base type system. E.g. Gauche's implementation of compound condition is an instance of <compound-condition> class, which is a subclass of <condition>, and I can use Gauche's type dispatch system to handle <condition> instances. With the pre-srfi compound objects, all of the compound objects becomes an instance of a single class and any dispatch needs to be predicate based, totally bypassing the native object system.