My vote would be "it depends" :) You mentioned several different instances of tradeoffs:
* I find io.Writer a bit special, because of it's pervasiveness; let's talk about image.Image, which is probably closer to what you're asking. It makes sense for the image package to bundle the Image interface with various implementations of it, the implementations likely share a bunch of code and you want the interface to be clear and centrally available, so that other packages can put it in their signatures and things work. Note, though, that even though the types also implement the draw.Image interface, that's in a different package.
* Encoding makes sense in it's own package; the encoders won't share a lot of code so it makes sense to put them into separate packages (also encouraging smaller binaries; don't need to link in encoders that won't be used). At the same time, you want the interfaces to, again, be centrally defined, so that other packages can use them in their own type definitions (which, AFAIR, is
how that package came to be in the first place). Thus, it makes sense to put the interfaces in a separate package at the place where it is in the hierarchy.
* database/sql doesn't have a real need for defining the interface. While it's definitely sensible to have an interface abstracting over a database for testing purposes or some abstractions in limited cases, in general, people will just use the concrete struct implementation and that's fine. Thus, in that case it makes sense to not have an interface at all and leave that up to packages wanting to use it. (full disclosure though: You could apply similar reasoning to log.Logger, which still makes me a bit sad for not being an interface…).
I think it makes sense, to make this tradeoff for the specific cases. If you expect a lot of reimplementations of that interface and people wanting to operate on the interface in general, it makes sense to provide it only once. If your provided implementations don't share much code and are worthy of own-packaged-nes, do the encoding thing.
There is this technical argument favoring writing the interface yourself though (where it makes sense), which is that two interfaces from different packages are different types, even if they share all methods, which will matter, if they in turn are to be used in interfaces or other type definitions (And before some zelot points me to it again: Yes, I know about #8082, yes, I agree it would be a good idea, but I'm also not optimistic that it'll happen, as it stands).