GWT History does offer a way to set the token without causing the on history changed method to be called History.newItem("registration", false);
As for your suggestion specifically about GWT History alone, ValueChange would implement the "state rendering", that would not work in cases where you need to pass more than a String to set the state. In such a case, I set a token as above and then use MVC to forward whatever data is needed to the view for rendering.
In any case, I definitely do not go through onValueChange in order to select a tab. I use rather something like tabPanel.selectTab(tabNum);
FWIW, The current state of GWT thinking moved from just history to using Activities and Places
You may want to see that as perhaps it better aligns with what you are trying to do.