A good working definition of coupling is as follows:
A certain kind of change to X triggers a corresponding change in YI find there are three properties of any given coupling that are almost always worth considering. In my experience, coupling should be necessary, explicit, and intentional.
I shouldn't have to spell out the point of checking for necessity but convention requires me to anyway. If you don't need to have a source of change for a particular block of code, then you should get rid of it and save yourself some wasted time later.
Explicitness is a little more interesting. Coupling can be subtle. Sometimes it's extremely subtle and only shows itself in the form of a problem. Sometimes just eliminating the subtlety is helpful because the next programmer (possibly your future self) will be able to see the coupling more easily and, thus, will be more likely to pay it the attention it deserves, if any.
Coupling should also be and look intentional. A developer who sees coupling - even explicit coupling - shouldn't have to spend additional effort to detect why that coupling exists.
So that's coupling: a change to one thing can necessitate a change to another thing. Keep it intentional, explicit, and important, when you can.