You can modify the source code, but I don't personally recommend it. It prevents the ability to upgrade without reconstructing all your modifications, and may even prohibit upgrading altogether.
You can modify the container so it applies an h4 tag instead of an h1 or h2. If you set up the title for the container as follows you won't have any problems with validation:
<div class="TitleHeadArea">
<h2>
<object id="dnnTITLE" codetype="dotnetnuke/server" codebase="TITLE">
<param name="CssClass" value="TitleHead" />
</object>
</h2>
</div>
Then in your container.css you can address the css font styles for the title by placing "h2 .TitleHead" or in your case "h4 .Titlehead" and adding the appropriate styles you want. This would be the easiest way to go without modifying dnn core code. This is also the html/object based skinning method, you could address the issue with similar approach in an .ascx file, it just depends on how your skin was designed. Also, don't just edit the container, make a copy of it with a new name so you can still use the original if needed, or at least have a working copy to reference if anything goes wrong.
PS. Also using this method, you can use the container in many places, and if you decide to change the style of the header, you only have to edit in one place, the container.css file, to have the changes updated to all instances of modules using that container. So, it's more efficient than adding html tags individually to the module title via the module settings page or the inline text editor.