It's worth pointing out that this is in fact necessary, as macro expansion can result in changes to type resolution that could otherwise lead to circularities.
Of expressions is definitely not possible -- what's the type of Default::default()?
Could you rephrase your request in terms of the properties of tokens? For example, could you accomplish your goal if there was a new literal_string matcher that accepted string literals, but not integer literals, or similar?
Expanding your motivation would really help here. Why do you want this at macro expansion time? Why can't you phrase your "do different things for different types" with traits in your scenario?
Typed macros are very rare. I know julia has a (very, very restrictive) form of them, and Nim has them straight up, along with incremental type checking. Presumably the pull/query-based nature of rustc fits pretty well with incremental type checking, but it complicates the design of the language a lot (nim's type checking is very ad-hoc and frequently admits bogus stuff).
The cool thing you can do with this is allow macros to participate in the normal trait system, so for example having a macro as part of a trait. Again, it really complicates things tremendously.