I was surprised to find the below code doesn't typecheck even with -XLiberalTypeSynonyms. Am I missing something or is this really not possible?

Reading the error message would help:

* The type synonym `Foo' should have 2 arguments, but has been given 1

-XLiberalTypeSynonyms relaxes the 'saturated application' rule a little https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/liberal_type_synonyms.html?highlight=type%20synonym#liberalised-type-synonyms

"You can apply a type synonym to a partially applied type synonym:"

But that isn't what you're doing. The docs say that still

" ... malformedness ... * Partially-applied type synonym."

Type Synonyms are not functions. Think of them as 'macro' expansions.

Possibly your `Bar` could be a type synonym, taking `(Foo Maybe)` as an argument in the `instance Eq`. What type is it exactly that you want to derive an instance for?