I think the best way to do this is to use one of the channels as a selection.
If you have a purely green circle on a white BG, make the red or blue channel from the channel window your selection (ctrl+click), inverse the selection and fill it with the color of the shape. The aliased edges should work as varying levels of transparency for whatever color you filled the selection with in this case.
EDIT: This isn't a perfect or super-convenient fix, but to deal with ones that aren't 0 in any channels, select the channel that has the darkest circle and fill the selection with the color you want. It will be semi-transparent. Then contract that same selection by 1-2 pixels and fill a new layer with the same color. Duplicate the contracted layer again and again until it's close or exact.
If you duplicate the layer without contracting it, you will duplicate the anti-aliasing and have hard edges. This fixes that.