The TraitExt pattern is a common way to add lots of default functionality to a trait, but equally for this problem, one could consider the Iterator pattern, where extension methods are provided on the base trait, with default implementations.
It is possible to implement methods in a trait where we require the type parameters to be constrained. For example
You could use where T: DummyTraitForBool and only provide impl DummyTraitForBool for bool {}, but Rust will not treat it as a boolean, but as an unknown type that has this or possibly other implementations.
Why? What do you need this for? In the context of generics, requiring a type to be a specific concrete type is a code smell – it shows that you are not programming against the interface, but you are relying on implementation details. That's almost never what the proper solution is. If you tell us more about what your use case is, we could perhaps provide a solution that does not require concretizing the types.