I'd like to entertain the idea of inheritance a bit, since maybe it will put more structure in the mess of subscriptions.

Subscription

// adds isUnsubscribed
BooleanSubscription extends Subscription 

 // adds setSubscription(...) throws if sets twice (like "val")
SingleAssignmentSubscription extends BooleanSubscription

 // allows to setSubscription twice, leaves previous unchanged (like "var")
MultipleAssignmentSubscription extends SingleAssignmentSubscription

 // allows to setSubscription twice, unsubscribes old one.
SerialSubscription extends MultipleAssignmentSubscription previous

// adds add/remove(...)
CompositeSubscription extends BooleanSubscription implements List<Subscription>

It is always safe to pass a DerivedSubscription where you expect a BaseSubscription (unless you want swapping a subscription to throw, but I would say that is more a promise from the caller that they will never set the subscription more than once).

On the other hand, perhaps this is over-design.