Thanks for writing this. It’s amazing how easy they all seem but so many forms are missing these simple things.
My comments: placeholder text is often viewed as the field is already entered. Also, placeholders used as labels can be confusing because the label disappears once you beginning typing (which you mentioned as a drawback under Input Hints) — causes users to forget what they’re entering and when they go back to check it’s not always apparent on what the field originally was for. It all depends on the context though.
A few things to add: labels should be visually distinct, inline validation, and marking optional fields as such (though the execution of this is highly debated).