A crate exists that solves this particular problem. Using the example given by @paholg:
use std::ops::Deref;
use disjoint_impls::disjoint_impls;
disjoint_impls! {
trait Foo {}
impl<T> Foo for T where T: Deref<Target = u8> {}
impl<T> Foo for T where T: Deref<Target = bool> {}
}
fn main() {}