Consider that
interface PasswordStore {
void store(Path path, String secret, Map metadata);
}
is identical to
void store (PasswordStore store, Path path, String secret, Map metadata)
or
store :: PasswordStore -> Path -> secret -> MetaData -> IO ()
So, you can treat PasswordStore as a pure data structure (that has things like connection details) and just define functions that use it. I wouldn't worry about grouping the functions together.(*) I'm going to assume you don't really need an actual interface, but if you did, you could investigate typeclasses.
Julian.
(*) In general terms, the only reason to group functions together is to enforce laws that relate the behaviours together e.g. that you can retrieve something you stored.