What about this note in the spec:

> Note: RFC 1945 and RFC 2068 specify that the client is not allowed
      to change the method on the redirected request.  However, most
      existing user agent implementations treat 302 as if it were a 303
      response, performing a GET on the Location field-value regardless
      of the original request method. The status codes 303 and 307 have
      been added for servers that wish to make unambiguously clear which
      kind of reaction is expected of the client.

Should we behave like most existing user agent implementations? or behave exactly to the spec? If we were to make the changes to behave as "most existing user agent implementations":

 # For `GET` or `HEAD` requests we follow redirects in `302` and `303` and responses and change the request method to GET.
 # For NON `GET`/`HEAD` requests we follow redirects in `303` and responses and change the request method to GET.
 # For `GET` or `HEAD` requests we follow redirects in `307` but keep the original request method.
 # For all other cases we don't follow the redirect but return the response as is.

`301` either fits into bullet 1 or 3 (I can't see clarification in the spec), but I suspect we maintain the original request method, unless it states otherwise (so it would fit into bullet 3).