An html element's start tag may be omitted if the first thing inside the html element is not a comment.
A head element's start tag may be omitted if the element is empty, or if the first thing inside the head element is an element.
A body element's start tag may be omitted if the element is empty, or if the first thing inside the body element is not a space character or a comment, except if the first thing inside the body element is a meta, link, script, style, or template element.
Yes... that's not pretty but it's there for backward compatibility with previous versions of HTML which were based on SGML. Best to explicitly use the proper start and end tags if you ask me, even if they are optional.