I checked and xsd:date +/- xsd:duration now returns xsd:date so this seems to be correct. Comparisons, however, do not work between xsd:date and xsd:datetime, because comparisons don't seem to use extensions, but instead they seem to go this route:
1. In CompareBOp, if both types are extensions, and they have the same type, then they are compared with compareTo.
2. compareTo uses delegate IVs as way to compare (in LiteralExtensionIV._compareTo) but again only if datatypes are equal
3. Fortunately, WikibaseDate delegates are longs suitable for such comparison, but that prevents comparing xsd:date to xsd:dateTime if both are extensions.
4. If the types do not match, the code goes to QueryEvaluationUtils.compareLiterals, however this one does not seem to support dates.
So I wonder whether it's possible to do it and I'm still doing something wrong, or it's impossible right now?
Comparison, of course, can be rewritten as (?x - ?y) < 0 etc. but this is not nice I think.