Empty list without list literals

This is my situation.
I want to make this rule:

{-# RULES "++ 1 element" forall x xs. (x:[]) ++ xs = x:xs #-}

However, I have OverloadedLists enabled, so this becomes.

{-# RULES "++ 1 element" forall x xs. (x:(fromList [])) ++ xs = x:xs #-}

Is there a way to avoid this automatic fromList? Also, I’d like to be able to just say that a list is normal for readability.
My soultion was to do this:
Make a helper function special casing those situations and just inline that instead.

(+++) :: [a] -> [a] -> [a] 
(+++) [] x = x 
(+++) [a] x = a:x 
(+++) xs ys = xs ++ ys
{-# INLINE (+++) #-}

But I’m still curious for a way to say that a list is of type [a] without using a type signature.

I don’t think there’s a way around this for overloaded literals. In this case you could also consider a more general rewrite rule that avoids []:

{-# RULES "cons/++" forall x xs ys. (x : xs) ++ ys = x : (xs ++ ys) #-}

Another workaround is to define the rewrite rule in another module and import it.

Good point, I thought about that, but I forgot I could disable default-extensions on a per-module basis.