diff --git a/fanotify_api.go b/fanotify_api.go
index c933bce..81d98a4 100644
--- a/fanotify_api.go
+++ b/fanotify_api.go
@@ -4,8 +4,11 @@
 package fanotify
 
 import (
+	"bytes"
 	"errors"
+	"fmt"
 	"os"
+	"strconv"
 
 	"golang.org/x/sys/unix"
 )
@@ -21,6 +24,8 @@ var (
 	ErrUnsupportedOnKernelVersion = errors.New("feature unsupported on current kernel version")
 )
 
+type EventMask uint64
+
 // Event represents a notification from the kernel for the file, directory
 // or a filesystem marked for watching.
 type Event struct {
@@ -33,7 +38,7 @@ type Event struct {
 	// only with kernels 5.9 or higher.
 	FileName string
 	// Mask holds bit mask representing the operation
-	Mask uint64
+	Mask EventMask
 }
 
 // Listener represents a fanotify notification group that holds a list of files,
@@ -199,3 +204,138 @@ func (l *Listener) RemoveAll() error {
 	l.watches = make(map[string]bool)
 	return nil
 }
+
+// Accessed returns true if the event mask contains file/directory accessed bit
+func (m EventMask) Accessed() bool {
+	return m&FileOrDirAccessedEvent == FileOrDirAccessedEvent
+}
+
+// Modified returns true if the event mask contains a file modified bit
+func (m EventMask) Modified() bool {
+	return m&FileModifiedEvent == FileModifiedEvent
+}
+
+// Closed returns true if the event mask contains a file closed bit
+func (m EventMask) Closed() bool {
+	return m&unix.FAN_CLOSE_WRITE == unix.FAN_CLOSE_WRITE || m&unix.FAN_CLOSE_NOWRITE == unix.FAN_CLOSE_NOWRITE
+}
+
+// Opened returns true if the event mask contains a file/directory opened bit
+func (m EventMask) Opened() bool {
+	return m&FileOrDirOpenedEvent == FileOrDirOpenedEvent
+}
+
+// Execed returns true if the event mask contains a file was opened for exec bit
+func (m EventMask) Execed() bool {
+	return m&FileOpenedForExecEvent == FileOpenedForExecEvent
+}
+
+// AttribChanged returns true if event mask contains a file/directory attribute changed bit
+func (m EventMask) AttribChanged() bool {
+	return m&FileOrDirMetadataChangedEvent == FileOrDirMetadataChangedEvent
+}
+
+// DirOp returns true if the event mask contained directory operation (opendir, readdir, closedir) bit
+func (m EventMask) DirOp() bool {
+	return m&DirectoryEvent == DirectoryEvent
+}
+
+// FileCreated returns true if the event mask contains file was created in marked parent bit
+func (m EventMask) FileCreated() bool {
+	return m&unix.FAN_CREATE == unix.FAN_CREATE
+}
+
+// DirCreated returns true if event mask contains dir was created in marked parent bit
+func (m EventMask) DirCreated() bool {
+	return m&unix.FAN_CREATE == unix.FAN_CREATE || m&unix.FAN_ONDIR == unix.FAN_ONDIR
+}
+
+// FileDeleted returns true if the event mask contains file was deleted in marked parent bit
+func (m EventMask) FileDeleted() bool {
+	return m&unix.FAN_DELETE == unix.FAN_DELETE
+}
+
+// DirDeleted returns true if the event mask contains directory was deleted in marked parent bit
+func (m EventMask) DirDeleted() bool {
+	return m&unix.FAN_DELETE == unix.FAN_DELETE || m&unix.FAN_ONDIR == unix.FAN_ONDIR
+}
+
+// FileSelfDeleted returns true if the event mask contains watched file is deleted bit
+func (m EventMask) FileSelfDeleted() bool {
+	return m&MarkedFileDeletedEvent == MarkedFileDeletedEvent
+}
+
+// DirSelfDeleted returns true if the event mask contains watched directory is deleted bit
+func (m EventMask) DirSelfDeleted() bool {
+	return m&unix.FAN_DELETE_SELF == unix.FAN_DELETE_SELF || m&unix.FAN_ONDIR == unix.FAN_ONDIR
+}
+
+// FileMovedFrom returns true if the event mask contains file moved from marked parent bit
+func (m EventMask) FileMovedFrom() bool {
+	return m&unix.FAN_MOVED_FROM == unix.FAN_MOVED_FROM
+}
+
+// DirMovedFrom returns true if the event mask contains directory moved from marked parent bit
+func (m EventMask) DirMovedFrom() bool {
+	return m&unix.FAN_MOVED_FROM == unix.FAN_MOVED_FROM || m&unix.FAN_ONDIR == unix.FAN_ONDIR
+}
+
+// FileMovedTo returns true if the event mask contains the file moved to marked parent bit
+func (m EventMask) FileMovedTo() bool {
+	return m&unix.FAN_MOVED_TO == unix.FAN_MOVED_TO
+}
+
+// DirMovedTo returns true if the event mask contains the directory moved to marked parent bit
+func (m EventMask) DirMovedTo() bool {
+	return m&unix.FAN_MOVED_TO == unix.FAN_MOVED_TO || m&unix.FAN_ONDIR == unix.FAN_ONDIR
+}
+
+// SelfMoved returns true if the event mask contains the marked file or directory moved bit
+func (m EventMask) SelfMoved() bool {
+	return m&MarkedFileOrDirectoryHasMovedEvent == MarkedFileOrDirectoryHasMovedEvent
+}
+
+// HasMovement returns true if the event mask contains file or directory has moved to/from the marked parent bit
+func (m EventMask) HasMovement() bool {
+	return m&FileOrDirectoryMovedEvent == FileOrDirectoryMovedEvent
+}
+
+func (m EventMask) String() string {
+	masks := map[EventMask]string{
+		FileOrDirAccessedEvent:              "file-or-dir-accessed",
+		FileModifiedEvent:                   "file-modified",
+		FileClosedEvent:                     "file-closed",
+		FileOrDirOpenedEvent:                "file-or-dir-opened",
+		FileOpenedForExecEvent:              "file-opened-for-exec",
+		FileOrDirMetadataChangedEvent:       "file-or-dir-attrib-changed",
+		DirectoryEvent:                      "dir-opened-read-or-closed",
+		FileCreatedInMarkedParentEvent:      "file-created",
+		DirectoryCreatedInMarkedParentEvent: "dir-created",
+		FileDeletedInMarkedParentEvent:      "file-deleted",
+		DirectoryDeletedInMarkedParentEvent: "dir-deleted",
+		MarkedFileDeletedEvent:              "marked-file-deleted",
+		MarkedDirectoryDeletedEvent:         "marked-dir-deleted",
+		FileMovedFromMarkedParentEvent:      "file-moved-from",
+		DirMovedFromMarkedParentEvent:       "dir-moved-from",
+		FileMovedToMarkedParentEvent:        "file-moved-to",
+		DirMovedToMarkedParentEvent:         "dir-moved-to",
+		MarkedFileOrDirectoryHasMovedEvent:  "marked-file-or-dir-moved",
+		QueueOverflowedEvent:                "kernel-queue-overflowed",
+		FileOrDirectoryMovedEvent:           "file-or-dir-moved",
+	}
+	var s bytes.Buffer
+	for flag, str := range masks {
+		if m&flag == flag {
+			s.WriteString(fmt.Sprintf("%s(0x%x)", str, flag))
+			s.WriteString(",")
+		}
+	}
+	if s.Len() == 0 {
+		return strconv.FormatUint(uint64(m), 16)
+	}
+	if s.Len() > 0 {
+		// strip the last comma
+		s.Truncate(s.Len() - 1)
+	}
+	return s.String()
+}
diff --git a/fanotify_event.go b/fanotify_event.go
index c4937f1..d1adfab 100644
--- a/fanotify_event.go
+++ b/fanotify_event.go
@@ -292,7 +292,7 @@ func (l *Listener) readEvents() error {
 				event := Event{
 					Fd:   int(metadata.Fd),
 					Path: string(name[:n1]),
-					Mask: metadata.Mask,
+					Mask: EventMask(metadata.Mask),
 				}
 				l.Events <- event
 
@@ -334,7 +334,7 @@ func (l *Listener) readEvents() error {
 					Fd:       fd,
 					Path:     pathName,
 					FileName: fileName,
-					Mask:     metadata.Mask,
+					Mask:     EventMask(metadata.Mask),
 				}
 				l.Events <- event
 				i += int(metadata.Event_len)
diff --git a/fanotify_event_types.go b/fanotify_event_types.go
index 47eef05..bfefa37 100644
--- a/fanotify_event_types.go
+++ b/fanotify_event_types.go
@@ -4,43 +4,43 @@ import "golang.org/x/sys/unix"
 
 const (
 	// FileOrDirAccessedEvent create an event when a file or directory is accessed
-	FileOrDirAccessedEvent uint64 = unix.FAN_ACCESS
+	FileOrDirAccessedEvent EventMask = unix.FAN_ACCESS
 	// FileModifiedEvent create an event when a file is modified
-	FileModifiedEvent uint64 = unix.FAN_MODIFY
+	FileModifiedEvent EventMask = unix.FAN_MODIFY
 	// FileClosedEvent create an event when a file is closed
-	FileClosedEvent uint64 = unix.FAN_CLOSE_WRITE | unix.FAN_CLOSE_NOWRITE
+	FileClosedEvent EventMask = unix.FAN_CLOSE_WRITE | unix.FAN_CLOSE_NOWRITE
 	// FileOrDirOpenedEvent create an event when a file or directory is opened
-	FileOrDirOpenedEvent uint64 = unix.FAN_OPEN
+	FileOrDirOpenedEvent EventMask = unix.FAN_OPEN
 	// FileOpenedForExecEvent create an event when a file is opened with the intent to be executed.
-	FileOpenedForExecEvent uint64 = unix.FAN_OPEN_EXEC
+	FileOpenedForExecEvent EventMask = unix.FAN_OPEN_EXEC
 	// FileOrDirMetadataChangedEvent create an event when a file or directory attributes have changed.
-	FileOrDirMetadataChangedEvent uint64 = unix.FAN_ATTRIB
+	FileOrDirMetadataChangedEvent EventMask = unix.FAN_ATTRIB
 	// DirectoryEvent create an event when directory is opened, read or closed.
-	DirectoryEvent uint64 = unix.FAN_ONDIR
+	DirectoryEvent EventMask = unix.FAN_ONDIR
 	// FileCreatedInMarkedParentEvent create event when a file is created under a marked parent directory.
-	FileCreatedInMarkedParentEvent uint64 = unix.FAN_CREATE | unix.FAN_EVENT_ON_CHILD
+	FileCreatedInMarkedParentEvent EventMask = unix.FAN_CREATE | unix.FAN_EVENT_ON_CHILD
 	// DirectoryCreatedInMarkedParentEvent create event when a directory is created under a marked parent directory.
-	DirectoryCreatedInMarkedParentEvent uint64 = unix.FAN_ONDIR | unix.FAN_CREATE | unix.FAN_EVENT_ON_CHILD
+	DirectoryCreatedInMarkedParentEvent EventMask = unix.FAN_ONDIR | unix.FAN_CREATE | unix.FAN_EVENT_ON_CHILD
 	// FileDeletedInMarkedParentEvent create event when a file is deleted under a marked parent directory.
-	FileDeletedInMarkedParentEvent uint64 = unix.FAN_DELETE | unix.FAN_EVENT_ON_CHILD
+	FileDeletedInMarkedParentEvent EventMask = unix.FAN_DELETE | unix.FAN_EVENT_ON_CHILD
 	// DirectoryDeletedInMarkedParentEvent create event when a directory is deleted under a marked parent directory.
-	DirectoryDeletedInMarkedParentEvent uint64 = unix.FAN_ONDIR | unix.FAN_DELETE | unix.FAN_EVENT_ON_CHILD
+	DirectoryDeletedInMarkedParentEvent EventMask = unix.FAN_ONDIR | unix.FAN_DELETE | unix.FAN_EVENT_ON_CHILD
 	// MarkedFileDeletedEvent create event when a marked file is deleted.
-	MarkedFileDeletedEvent uint64 = unix.FAN_DELETE_SELF
+	MarkedFileDeletedEvent EventMask = unix.FAN_DELETE_SELF
 	// MarkedDirectoryDeletedEvent create an event when a marked directory is deleted.
-	MarkedDirectoryDeletedEvent uint64 = unix.FAN_ONDIR | unix.FAN_DELETE_SELF
+	MarkedDirectoryDeletedEvent EventMask = unix.FAN_ONDIR | unix.FAN_DELETE_SELF
 	// FileMovedFromMarkedParentEvent create an event when file has been moved from a marked parent directory.
-	FileMovedFromMarkedParentEvent uint64 = unix.FAN_MOVED_FROM | unix.FAN_EVENT_ON_CHILD
+	FileMovedFromMarkedParentEvent EventMask = unix.FAN_MOVED_FROM | unix.FAN_EVENT_ON_CHILD
 	// DirMovedFromMarkedParentEvent create an event when a directory has been moved from a marked parent directory.
-	DirMovedFromMarkedParentEvent uint64 = unix.FAN_ONDIR | unix.FAN_MOVED_FROM | unix.FAN_EVENT_ON_CHILD
+	DirMovedFromMarkedParentEvent EventMask = unix.FAN_ONDIR | unix.FAN_MOVED_FROM | unix.FAN_EVENT_ON_CHILD
 	// FileMovedToMarkedParentEvent create an event when file has been moved to a marked parent directory.
-	FileMovedToMarkedParentEvent uint64 = unix.FAN_MOVED_TO | unix.FAN_EVENT_ON_CHILD
+	FileMovedToMarkedParentEvent EventMask = unix.FAN_MOVED_TO | unix.FAN_EVENT_ON_CHILD
 	// DirMovedToMarkedParentEvent create an event when a directory has been moved to a marked parent directory.
-	DirMovedToMarkedParentEvent uint64 = unix.FAN_ONDIR | unix.FAN_MOVED_TO | unix.FAN_EVENT_ON_CHILD
+	DirMovedToMarkedParentEvent EventMask = unix.FAN_ONDIR | unix.FAN_MOVED_TO | unix.FAN_EVENT_ON_CHILD
 	// MarkedFileOrDirectoryHasMovedEvent create an event when a marked file or directory has moved.
-	MarkedFileOrDirectoryHasMovedEvent uint64 = unix.FAN_MOVE_SELF
+	MarkedFileOrDirectoryHasMovedEvent EventMask = unix.FAN_MOVE_SELF
 	// QueueOverflowedEvent create an event when the kernel event queue has overflowed.
-	QueueOverflowedEvent uint64 = unix.FAN_Q_OVERFLOW
+	QueueOverflowedEvent EventMask = unix.FAN_Q_OVERFLOW
 	// FileOrDirectoryMovedEvent create an event when a file or directory has moved.
-	FileOrDirectoryMovedEvent uint64 = FileMovedFromMarkedParentEvent | FileMovedToMarkedParentEvent | DirMovedFromMarkedParentEvent | DirMovedToMarkedParentEvent
+	FileOrDirectoryMovedEvent EventMask = FileMovedFromMarkedParentEvent | FileMovedToMarkedParentEvent | DirMovedFromMarkedParentEvent | DirMovedToMarkedParentEvent
 )
