Try thinking of it this way instead. You are going to serve some representation on the web, for this thing. Are those going to be (a) ABOUT the thing, or (b) the CONTENT of this thing denoted by the URI? If the former, you must use # or 303. If the later, you can serve the representations with 200 from that URI. You see, 200 means (basically) "Here comes the content of the document you asked for" and 303 means "Here is the URI of document ABOUT the thing you asked for.
That seems a pretty good characterisation of the 303 decision. Information resources can serve up representations of themselves, other resources cannot so you have to make do with descriptions. (Regular readers will already know that I don't fully agree with this model, but it's the accepted one in the SemWeb community)
There appears to be an asymmetry about this though and I think it's a limitation of the model.
Suppose I have a resource "R" with URI http://example.org/R. If it is an "Information Resource" then I can arrange things so that a GET request for its text/html representation responds with a 200 and the HTML in the body of the response. I could also arrange for a request for its application/rdf+xml representation to respond with a 303 status and the URI of another information resource "RDESC" (e.g. http://example.org/RDESC). In this example the 303 response meand that "R" cannot be represented as RDF, but there's an alternative RDF document that is a description of R. The user can then re-issue the request on http://example.org/RDESC to obtain that description.
Now, I can arrange for http://example.org/RDESC to return an RDF representation in a 200 response. But, here's the asymmetry. How can I allow the user to obtain a description of RDESC? The representation I send back is the content of RDESC, not its description. I can't use the media type to distinguish the type of request any more.
In case you think this is an artificial distinction, it's not. We're dealing with it right now at Talis (and have been for a number of months). We give access to a number of RDF graphs via HTTP where naturally the user wants to obtain the content of the graph as the response to a GET. We also serve RDF descriptions of those graphs containing some configuration information. There's no standard way to link the two things together so that users can select either the description or the content using HTTP.
Now, I happen to think that there is an interesting solution to this asymmetry. Suppose we created a new HTTP header called "resource-description" whose value was the URI of a description of the given resource. Note that it's a description of the resource, not of any representation that is being sent as part of the response. The asynmmetry goes away because this gives you a method of pointing to the description regardless of the status code and/or content negotiation going on in the request.
Things get even more interesting if you allow multiple resource-description headers: what a great way to cross link to other people's descriptions of your resource.
I seem to recall something similar to this being proposed a few years back but my Googling doesn't turn anything up. Going back further takes us to Patrick Stickler's attempts to solve the description problem using URIQA, which took the approach of introducing another verb, MGET, to obtain the description. This was almost universally disliked, but the underlying problem has remained unsolved in the meantime.
And given where my head has been for the past few weeks, I have to ask what decision would have been taken on the httpRange-14 issue if this header had already existed. Would instead we be returning 406 responses when we cannot supply a suitable representation for resources, or even a 204. Both of those could work with the header pointing to an appropriate description of the resource.
Update: it seems that timbl and I were touched by the same muse tonight: Alternative to 303 response: Description-ID: header