I don't think there is a definitive answer to your question. But I can give you some hard won advice. Here are some things to consider:
It is time consuming to write marshalling and unmarhsalling code, especially the first time.
You will have to spend quite a bit of time learning the nuances of your DOM library (Xerces or its equivalent).
There is lots of duplication so you'll eventually be driven to writing some helper classes.
You'll need lots of unit tests to make sure you've covered all of your bases in the area of optional elements and attributes.
Looking at that list it is pretty easy to say "that's what JAXB does for me". Having done for this for a number of years I would say that JAXB saves you quite a bit of time and effort, especially the latest iteration of JAXB in Java 5/6.
But if you go with JAXB there is one lesson we've learned the hard way that I would like to pass along:
*** Do not to let the JAXB generated classes leak into your application.
As you said in your question, this ties your entire application to the way JAXB does thing. If JAXB has to be replaced (there are a number of reason why you might do that in the future) then you will be faced with a challenging and painful task (trust me, we've done it and we'll never get into that position again).
Now we always hide our JAXB generated classes behind a facade or a factory, mapping from the JAXB classes to our own domain POJOs that have the required behavior. We think of JAXB as we do JDBC; JAXB is just another data source, another way of getting data to and from our domain POJOs. The domain POJOs are the secret sauce and we control how they are coded and how they are used. JAXB is just a tool for marshalling and unmarshalling.