Si OP u otros aún están buscando una forma de modificar el historial del navegador para habilitar el estado, usar pushState y replaceState, como lo sugiere IESUS, es la forma 'correcta' de hacerlo ahora. Su principal ventaja sobre location.hash parece ser que crea URL reales, no solo hashes. Si se guarda el historial del navegador con hashes y luego se vuelve a visitar con JavaScript deshabilitado, la aplicación no funcionará, ya que los hash no se envían al servidor. Sin embargo, si se ha utilizado pushState, la ruta completa se enviará al servidor, que luego puede construir para responder adecuadamente a las rutas. Vi un ejemplo en el que se usaban las mismas plantillas de bigote tanto en el servidor como en el lado del cliente. Si el cliente tuviera habilitado JavaScript, obtendría respuestas rápidas al evitar el viaje de ida y vuelta al servidor, pero la aplicación funcionaría perfectamente bien sin el Javascript. Por lo tanto, la aplicación puede degradarse con gracia en ausencia de JavaScript.
Además, creo que hay un marco por ahí, con un nombre como history.js. Para los navegadores que admiten HTML5, usa pushState, pero si el navegador no lo admite, automáticamente recurre al uso de hashes.