According to
https://www.w3.org/TR/2004/REC-owl-semantics-20040210/direct.html#3.3 the simplest distinction is that a DatatypeProperty cannot be Symmetric, InverseFunctional, or Transitive, which makes sense because the subject of a triple can only be an object. The text for a DatatypeProperty has "EC(d
1)×LV" which seems to reference the cross product of the domain and values, while for an ObjectProperty it has "EC(d
1)×
O" with the domain and objects. I think this is strange because I would have expected the domains to be identical and the ranges to be different, I would have expected DatatypeProperties to formally only reference something in LV and ObjectProperties only something in O, not just in their descriptive text. Since something can't be in LV and O at the same time, something can't be both a DatatypeProperty and an ObjectProperty, it would just be an rdf:Property.
In
https://www.w3.org/TR/owl-ref/#Property there is a "NOTE: In OWL Full, object properties and datatype properties are
not disjoint." These warnings might be about having an ontology automatically trigger the dreaded OWL Full unintentionally, which is why it would be a warning and not an error.