What if into_open_drain_output would return not only an OutputPin, but also an InputPin? This would be more clear than the specialization of the is_low() in OpenDrain mode.
The only drawback I see is that both of the returned structs should be consumed by the next into_XXX call.
See explanation at #51