After git bisecting the code I found that starting from commit b9ab3f5bf4222a284f92d43cc56fd323ce2d8751 there is a issue when converting GIFs from "P" format to either "RGB" or "RGBA".
In this case, pillow generates a black and white only image as it can be seen further down.
I'll try to understand what's happening and make a pull request latter.
This little snippet shows a way to reproduce it:
from PIL import Image
from urllib2 import urlopen
from io import BytesIO
imgbuffer = urlopen('http://www.eecs.berkeley.edu/~loarie/test.colors.gif').read()
img = Image.open(BytesIO(imgbuffer))
rgbimg = img.convert('RGB')
rgbimg.save(open('tmp.gif', 'w'), 'GIF')
Result:

Expected:

cc: commit author @d-schmidt
I think that this is the same as #403, which was localized to the same commit. Can you check head to see if the patch in #405 is a fix?
No the problem here lies in the automatic P conversion on save. #405 seems to change the result, at least my bugged image looks different but it doesn't solve this problem.
We can remove the "feature" maintaining the old palette but it bloats the result file. I'm checking how to solve it properly and I'm currently stumbling across the optimization.
After going through the code I think the best thing to do would be to revert the offending commit for now.
The biggest issue I found is that it's not safe to reuse the original palette after calling convert() on the image. The problem is that although convert() preserves the original self.palette it's no longer valid because as part of the conversion process a new palette is generated and the image pixels use this new information.
I think a full solution to reuse the palette would need to address it during the quantization phase of the conversion, limiting the possible colors to the ones already on the palette. But it seems a much more complex thing to do.
Please try https://github.com/d-schmidt/Pillow/commit/ac6a731bb905a2dc591a921df2b421c7f28dd597
It is not yet ready to merge until we've checked what happens to L-mode and transparent gifs.
new result:

Notice this is different on binary level. Colors switched places in the palette going through two conversions and optimization.
from PIL import Image
f = open("testbild/test.colors.gif", "rb")
i = Image.open(f)
i.save("test1.gif")
i.save("test2.gif") # check optimization result
i = i.convert("RGB")
i.save("test3.gif") # check automatic P conversion
I think moving im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) to right after the automatic conversion would fix it for L GIFs. Currently it's broken.
It is there to prevent the gif lib from saving the complete WEB gif palette if you just open and save a new gif. I don''t know yet why it is done at all. Imo it should use the loaded palette from the file.
Will put some more time into it tomorrow.
Or next year. This is not forgotten but I'm on a tight schedule atm.
Now targeting 2.4.0
Most helpful comment
Please try https://github.com/d-schmidt/Pillow/commit/ac6a731bb905a2dc591a921df2b421c7f28dd597
It is not yet ready to merge until we've checked what happens to L-mode and transparent gifs.
new result:

Notice this is different on binary level. Colors switched places in the palette going through two conversions and optimization.